import BaseManage from "../manage/baseManage.js";
import EventProduct from "../event/eventProduct.js";

/**
 * @description 商品基础管理器
 * @class {ShopCartListModel}
 * @extends{BaseManage} 基础对象模型
 * @author hhx
 * @date 2024-11-26 10:11
 * @version 0.1.2
 */
export default class ShopCartListModel extends BaseManage {

    /**
     * @description 事件生产者
     * @private
     * @type {Map}
     */
    _eventProduct = null;

    /**
     * @description 商品列表
     * @private
     * @type {Array} 商品列表
     */
    _shopCartList = null;

    /**
     * @description 购物车商品总价
     * @private
     * @type {number}
     */
    _totalPrice = undefined;

    /**
     * @description 基础管理器构造函数
     * @public
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props = {}) {
        super(props);
    }

    /**
     * @description 实例化 购物车列表模型
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {ShopCartListModel|*} 商品数据
     */
    static instance(props = {}) {
        let instance = new ShopCartListModel(props);
        instance.init(props);
        return instance;
    }

    //========================== 成员属性 ==========================

    /**
     * @description 获取 事件集合
     * @property
     * @protected
     * @return {Map} 事件集合
     */
    get eventProduct() {
        return this._eventProduct;
    }

    /**
     * @description 设置 事件集合
     * @property
     * @protected
     * @param eventProduct {Map} 事件集合
     */
    set eventProduct(eventProduct) {
        this._eventProduct = eventProduct;
    }

    /**
     * @description 获取 商品列表
     * @property
     * @protected
     * @return {Array} 商品列表
     */
    get shopCartList() {
        return this._shopCartList;
    }

    /**
     * @description 设置 商品列表
     * @property
     * @protected
     * @param value {Array} 商品列表
     */
    set shopCartList(value) {
        this._shopCartList = value;
    }

    /**
     * @description 获取 购物车总价
     * @property
     * @protected
     * @return {number} 购物车总价
     */
    get totalPrice() {
        return this._totalPrice;
    }

    /**
     * @description 设置 购物车总价
     * @property
     * @protected
     * @param value {number} 购物车总价格
     */
    set totalPrice(value) {
        this._totalPrice = value;
    }


    //========================== 成员方法 ==========================

    /**
     * @description 获取商品列表
     * @public
     * @return {Array} 商品列表
     */
    getShopCartList() {
        return this.shopCartList;
    }

    /**
     * @description 设置商品列表
     * @public
     * @param value {Array} 商品列表
     */
    setShopCartList(value) {
        this.shopCartList = value;
    }


    /**
     * @description 获取事件集合
     * @public
     * @return {Map} 事件集合
     */
    getEventProduct() {
        return this.eventProduct;
    }

    /**
     * @description 设置事件集合
     * @public
     * @param newValue {Map} 事件集合
     */
    setEventProduct(newValue) {
        this.eventProduct = newValue;
    }

    /**
     * @description 获取购物车总价
     * @public
     * @return {number} 购物车总价
     */
    getTotalPrice() {
        return this.totalPrice;
    }

    /**
     * @description 设置购物车总价格
     * @public
     * @param value {number} 购物车总价格
     */
    setTotalPrice(value) {
        this.totalPrice = value;
    }

    //========================== 接口方法 ==========================

    /**
     * @description 添加商品
     * @abstract
     * @param target {object} 触发事件对象
     * @param product {object} 商品
     */
    addProduct(target, product) {
        this.shopCartList.push(product);
        this.triggerAddCartProduct(target, this.getShopCartList());
        this.setTotalPrice(this.computedTotalPrice())
    }

    /**
     * @description 修改商品
     * @abstract
     * @param id {number} 商品id
     */
    removeProduct(id) {
        //
    }

    /**
     * @description 删除商品
     * @abstract
     * @param product {object} 商品
     */
    updateProduct(product) {
        //
    }

    /**
     * @description 查找商品
     * @abstract
     * @param id {number} 商品id
     */
    findProduct(id) {
        //
    }

    //========================== 构建方法 ==========================

    /**
     * @description 初始化方法
     * @protected
     * @override
     */
    init(props) {
        super.init(props);

        //构建生产者
        this.buildEventProduct();

        //初始化商品列表
        this.initShopCartList();

        //初始化商品总价
        this.initTotalPrice();
    }


    /**
     * @description 构建 事件生产者
     * @protected
     */
    buildEventProduct() {
        let eventProduct = this.createEventProduct();
        this.setEventProduct(eventProduct);
    }

    //=========================== 内部方法 ===============================

    /**
     * @description 购物车列表初始化
     * @protected
     */
    initShopCartList() {
        this.shopCartList = []
    }

    /**
     * @description 购物车总价初始化
     * @protected
     */
    initTotalPrice() {
        this.totalPrice = 0;
    }

    /**
     * @description 计算购物车商品总价
     * @protected
     * @return {number} 总价
     */
    computedTotalPrice() {
        let totalPrice = 0;
        let shopCartList = this.getShopCartList();
        shopCartList.forEach(item => {
            totalPrice += item.price;
        })
        return totalPrice
    }

    //=========================== 创建方法 ===============================

    /**
     * @description 创建 事件生产者
     * @protected
     * @returns {Map} 事件生产者
     */
    createEventProduct() {
        return EventProduct.instance();
    }

    //=========================== 事件订阅 ===============================

    /**
     * @description 订阅添加商品到购物车事件
     * @public
     * @param callback {Function} 回调函数
     */
    subscriberAddCartProduct(callback) {
        this.eventProduct.subscriberEvent(this, 'addCartProduct', callback);
    }

    //=========================== 事件触发 ===============================

    /**
     * @description 触发添加商品到购物车事件
     * @protected
     * @param target {Object} 触发事件对象
     * @param param {*} 参数值
     */
    triggerAddCartProduct(target, param) {

        this.eventProduct.triggerEvent(target, 'addCartProduct', param);

    }

}





